import axios from 'axios';
import { getAccessToken, getRefreshToken, isTokenExpired, clearAuthData, saveAuthData, getUserInfo } from '../auth/authService';

// Token存储键名
const REFRESH_TOKEN_KEY = 'refresh_token';

// 后端API基础URL
const API_BASE_URL = 'http://localhost:3000';

// 创建axios实例
const instance = axios.create({
  baseURL: API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  },
  // 允许携带跨域凭证（如cookies）
  withCredentials: true,
});

// 是否正在刷新token
let isRefreshing = false;
// 存储等待刷新token的请求队列
let pendingRequests: Array<(token: string | null) => void> = [];

// 处理等待队列中的请求
const processPendingRequests = (token: string | null) => {
  pendingRequests.forEach((callback) => callback(token));
  pendingRequests = [];
};

// 检查是否需要刷新token
const checkAndRefreshToken = async (): Promise<string | null> => {
  // 避免重复刷新
  if (isRefreshing) {
    return new Promise((resolve) => {
      pendingRequests.push(resolve);
    });
  }

  try {
    isRefreshing = true;
    const token = getAccessToken();
    
    // 如果没有token或token未过期，直接返回
    if (!token) {
      return null;
    }
    
    if (!isTokenExpired()) {
      return token;
    }
    
    // 获取刷新token
    const refreshToken = getRefreshToken();
    
    if (!refreshToken) {
      console.warn('没有刷新token，清除认证数据');
      clearAuthData();
      return null;
    }
    
    // 调用刷新token接口
    const response = await instance.post('/auth/refresh', {
      refresh_token: refreshToken,
    });
    
    const { access_token, refresh_token } = response;
    
    // 保存新token
    const userInfo = getUserInfo();
    saveAuthData({
      accessToken: access_token,
      refreshToken: refresh_token,
      user: userInfo || { username: '', email: '' },
    });
      
      // 处理等待队列
      processPendingRequests(access_token);
      
      return access_token;
  } catch (error) {
    console.error('Token刷新失败:', error);
    // 清除认证数据
    clearAuthData();
    
    // 处理所有等待的请求
    processPendingRequests(null);
    
    return null;
  } finally {
    isRefreshing = false;
  }
};

// 请求拦截器
instance.interceptors.request.use(
  async (config) => {
    // 跳过认证的请求（如登录、注册等）
    const skipAuth = config.url?.includes('/sdf ') || 
                     config.url?.includes('/auth/register') ||
                     config.url?.includes('/auth/refresh');
    
    if (!skipAuth) {
      const token = await checkAndRefreshToken();
      
      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      } else if (typeof window !== 'undefined') {
        // 如果没有有效token，重定向到登录页
        // window.location.href = '/login';
      }
    }
    
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 直接返回响应数据
    return response.data;
  },
  async (error) => {
    // 保存原始请求配置
    const originalRequest = error.config;
    
    // 处理401未授权错误
    if (error.response?.status === 401 && !originalRequest?._retry) {
      // 标记请求已重试，避免无限循环
      originalRequest._retry = true;
      
      // 尝试刷新token
      const newToken = await checkAndRefreshToken();
      
      if (newToken) {
        // 使用新token重试请求
        originalRequest.headers.Authorization = `Bearer ${newToken}`;
        return instance(originalRequest);
      }
      
      // 如果没有有效token，清除认证信息并重定向到登录页
      clearAuthData();
      
      if (typeof window !== 'undefined') {
        // window.location.href = '/login';
      }
      
      return Promise.reject(new Error('登录已过期，请重新登录'));
    }
    
    // 其他错误处理
    if (error.response) {
      // 服务器返回错误状态码
      switch (error.response.status) {
        case 400:
          console.error('请求参数错误:', error.response.data?.message || 'Bad Request');
          break;
        case 403:
          console.error('拒绝访问，权限不足');
          break;
        case 404:
          console.error('请求的资源不存在');
          break;
        case 500:
          console.error('服务器错误');
          break;
        default:
          console.error(`请求失败: ${error.response.status}`);
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      console.error('网络错误，请检查您的网络连接');
    } else {
      // 其他错误
      console.error('请求错误:', error.message);
    }
    
    return Promise.reject(error);
  }
);

export default instance;